package cn.iocoder.yudao.module.hs.service.scan;

import cn.iocoder.yudao.module.hs.controller.admin.material.vo.MaterialRespVO;
import cn.iocoder.yudao.module.hs.controller.admin.materialbox.vo.MaterialBoxRespVO;
import cn.iocoder.yudao.module.hs.controller.admin.scan.vo.ScanInfoRespVO;
import cn.iocoder.yudao.module.hs.controller.admin.scan.vo.ScanManualAdjustReqVO;
import cn.iocoder.yudao.module.hs.controller.admin.scan.vo.ScanMergeReqVO;
import cn.iocoder.yudao.module.hs.controller.admin.scan.vo.ScanPushReqVO;
import cn.iocoder.yudao.module.hs.dal.dataobject.material.MaterialDO;

import java.util.List;

/**
 * 扫码相关 Service 接口
 *
 * @author 航盛
 */
public interface ScanService {

    /**
     * 将扫码到的物料list推送到缓存中，作为已选备选
     *
     * @param scanPushReqVO 扫码物料信息推送
     * @return 临时保存的，被扫码获取的物料list
     */
    List<MaterialDO> pushScanMaterials(ScanPushReqVO scanPushReqVO);

    /**
     * 获取已拣取清单
     *
     * @param pickTaskId
     * @return
     */
    List<ScanInfoRespVO> getPickedList(Long pickTaskId);

    /**
     * 合托
     *
     * @param scanMergeReqVO
     */
    void merge(ScanMergeReqVO scanMergeReqVO);

    /**
     * 创建托盘和RFID并进行绑定
     *
     * @param code
     */
    void create(String code);

    /**
     * 获取RFID对应的待拣取的物料清单
     *
     * @param rfidCode
     * @return
     */
    List<MaterialRespVO> getToBePickedMaterialList(Long pickTaskId, String rfidCode, Integer light);

    /**
     * 获取RFID对应的待拣取的物料清单
     *
     * @param rfidCode
     * @return
     */
    List<MaterialBoxRespVO> getToBePickedMaterialBoxList(Long pickTaskId, String rfidCode, Integer light);

    /**
     * 给指定标签发送闪灯指令
     *
     * @param rfidCode
     * @param color
     */
    void lightFlash(String rfidCode, Integer color);

    /**
     * 扫托盘获取信息
     *
     * @param code 扫码查询托盘、RFID信息
     * @return
     */
    ScanInfoRespVO getTrayRfidInfo(String code);

    /**
     * 扫托盘获取信息
     *
     * @param code 扫码查询托盘、RFID信息
     * @return
     */
    List<ScanInfoRespVO> getMaterialBoxInfo(Long pickTaskId, Long shipOrderId, String code);

    /**
     * 扫物料获取信息
     *
     * @param code 扫码查询物料信息
     * @return 物料/物料箱
     */
    ScanInfoRespVO getMaterialBoxByCode(String code);

    /**
     * 手动调整
     *
     * @param reqVO 手动调整入参
     */
    void manualAdjust(ScanManualAdjustReqVO reqVO);

    /**
     * 合托
     *
     * @param trayCode 托盘码
     * @param addList  要添加的物料
     */
    void doMergeTray(String trayCode, List<ScanManualAdjustReqVO.AdjustMaterial> addList);

    /**
     * 拆托
     *
     * @param reduceList 要删除的物料
     */
    void doSplitTray(List<ScanManualAdjustReqVO.AdjustMaterial> reduceList);

    /**
     * 合箱
     *
     * @param trayCode 托盘码
     * @param boxCode  物料箱码
     * @param addList  要添加的物料
     */
    void doMergeBox(String trayCode, String boxCode, List<ScanManualAdjustReqVO.AdjustMaterial> addList);

    /**
     * 拆箱
     *
     * @param reduceList 要删除的物料
     */
    void doSplitBox(List<ScanManualAdjustReqVO.AdjustMaterial> reduceList);
}
